/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package ASAExpr;

import exception.DivisionByZeroException;
import exception.VariableNonDeclareeException;

/**
 *
 * @author FM & KB
 */
public abstract class ASAExpr {
    
    /**
     * Retourne le premier ASAExpr
     * @return ASAExpr
     */
    public ASAExpr getExpr1(){
        return null;
    }
    
    /**
     * Retourne le second ASAExpr
     * @return ASAExpr
     */
    public ASAExpr getExpr2(){
        return null;
    }
    
    /**
     * Retourne un ASAExpr simplifié afin d'en optimiser l'exécution 
     * @return ASAExpr
     */
    public ASAExpr simplifie() throws VariableNonDeclareeException, DivisionByZeroException
    {
        return this;
    }
    
    /**
     * Evalue l'arbre et retourne sa valeur
     * @return int
     */
    public abstract int evalue() throws VariableNonDeclareeException, DivisionByZeroException;
    
    /**
     * Affiche le label du noeud courant
     * @return 
     */
    public abstract String getLabelExplorateur();
    
    /**
     * 
     * @return 
     */
    public int getValeur() {
        return -1;
    }
    
    /**
     * Retourne l'affichage de l'arbre
     * @return 
     */
    public String notationExplorateur() {
        return notationExplorateur("");
    }
    
    /**
     * Retourne l'affichage de l'arbre à partir d'un préfixe
     * @param prefixe
     * @return String
     */
    public String notationExplorateur(String prefixe) {
        String res = prefixe + getLabelExplorateur() + "\n";
        String prefixeSuiv = prefixe + "  ";
        ASAExpr e1 = getExpr1();
        ASAExpr e2 = getExpr2();
        if (e1 != null)
            res += e1.notationExplorateur(prefixeSuiv);
        if (e2 != null)
            res += e2.notationExplorateur(prefixeSuiv);
        return res;
    }
}
